/********************************Copyright (c)**********************************\
**
**                   (c) Copyright 2023, Main, China, QD.
**                           All Rights Reserved
**
**                                 By(wo4fisher)
**                           http://www.wo4fisher.com
**
**----------------------------------文件信息------------------------------------
** 文件名称: stepMortor.c
** 创建人员: wht
** 创建日期: 2023-10-20
** 文档描述:
**
**----------------------------------版本信息------------------------------------
** 版本代号: V0.1
** 版本说明: 初始版本
**
**------------------------------------------------------------------------------
\********************************End of Head************************************/
#include "stepMortor.h"
#include "ocs.h"

#define MOTORCNTMAX 4000
#define CW 0X00//正向，开口越大
#define CCW 0X01//负向，开口越小

volatile uint16_t stepMotor_CurrentOpenness,stepMotor_DescOpenness,stepMotor_TempOpenness;//当前开度(开机后根据设定流量计算当前开度值)，目标开度，临时开度
volatile static uint8_t stepMotorDir=CCW;

/*******************************************************************************
** 函数名称: Bsp_StepMotor_Calc_Openness
** 功能描述: 根据流量计算流量阀的开度
** 参数说明: flow: [输入/出]
** 返回说明: None
** 创建人员: wht
** 创建日期: 2023-10-23
**------------------------------------------------------------------------------
** 修改人员:wht
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
uint16_t Bsp_StepMotor_Calc_Openness ( float flow ) //计算开度对应脉冲位置
{
    uint16_t temp;
    temp = ( uint16_t ) ( ( flow-O2FLOWMIN ) *MOTORCNTMAX/4.6 ); // 4000/4.6
    return temp;
}

void _StepMotor_Reset(void)
{
    HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
}
/*******************************************************************************
** 函数名称: StepMotor_Rotate
** 功能描述: 根据脉冲数开关流量阀
** 参数说明: p: [输入/出]
** 返回说明: None
** 创建人员: wht
** 创建日期: 2023-10-23
**------------------------------------------------------------------------------
** 修改人员:wht
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void StepMotor_Rotate ( uint8_t p )
{
    switch ( p ) //根据脉冲数控制步进
    {
    case 7://A
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
        break;
    case 6://AB
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
        break;
    case 5://B
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
        break;
    case 4://BC
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
        break;
    case 3://C
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
        break;
    case 2://CD
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
        break;
    case 1://D
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
        break;
    case 0://DA
        HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
        HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
        HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
        break;
    default:
        break;
    }
    HAL_Delay ( 1 );
}

/*******************************************************************************
** 函数名称: Bsp_StepMotor_AdjustOpenness
** 功能描述: 根据目标脉冲数位置调整步进电机
** 参数说明: adjustOpenness: [输入/出]
** 返回说明: None
** 创建人员: wht
** 创建日期: 2023-10-23
**------------------------------------------------------------------------------
** 修改人员:wht
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Bsp_StepMotor_AdjustOpenness ( uint16_t adjustOpenness )
{
    uint16_t i;
    if ( adjustOpenness==stepMotor_CurrentOpenness ) return; //不需要调整，直接退出
    // 1. 判断方向
    if ( adjustOpenness>stepMotor_CurrentOpenness )
        stepMotorDir = CW;
    if ( adjustOpenness<stepMotor_CurrentOpenness )
        stepMotorDir = CCW;
    // 2. 根据方向和目标位置调整步进
    if ( stepMotorDir == CW ) //stepMotor_CurrentOpenness-->adjustOpenness
    {
        i = stepMotor_CurrentOpenness+1;
        while ( i<=adjustOpenness )
        {
            StepMotor_Rotate ( i%8 );
            i++;
        }
    }
    if ( stepMotorDir == CCW ) //adjustOpenness-->stepMotor_CurrentOpenness
    {
        i = stepMotor_CurrentOpenness;
        while ( i>=adjustOpenness )
        {
            StepMotor_Rotate ( i%8 );
            i--;
        }
    }
		_StepMotor_Reset();
    //3. 更新目标值
    stepMotor_CurrentOpenness = adjustOpenness;
}

/*******************************************************************************
** 函数名称: Bsp_StepMotor_AdjustOpenness_f
** 功能描述: 根据目标流量值调整流量阀
** 参数说明: f: [输入/出]
** 返回说明: None
** 创建人员: wht
** 创建日期: 2023-10-23
**------------------------------------------------------------------------------
** 修改人员:wht
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Bsp_StepMotor_AdjustOpenness_f ( float f )
{
    uint16_t i;
    i = Bsp_StepMotor_Calc_Openness ( f );
    Bsp_StepMotor_AdjustOpenness ( i );
}


void StepMotor_Test ( uint16_t n )
{
    uint16_t i;
    for ( i=0; i<n; i++ )
    {
        switch ( i%8 )
        {
        case 0://A
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
            break;
        case 1://AB
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
            break;
        case 2://B
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
            break;
        case 3://BC
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
            break;
        case 4://C
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
            break;
        case 5://CD
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
            break;
        case 6://D
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
            break;
        case 7://DA
            HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_SET );
            HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
            HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_SET );
            break;
        default:
            break;
        }
        HAL_Delay ( 1 );
    }
    HAL_GPIO_WritePin ( ULN2003_A_GPIO_Port,ULN2003_A_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_B_GPIO_Port,ULN2003_B_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_C_GPIO_Port,ULN2003_C_Pin,GPIO_PIN_RESET );
    HAL_GPIO_WritePin ( ULN2003_D_GPIO_Port,ULN2003_D_Pin,GPIO_PIN_RESET );
}


/********************************End of File************************************/
